package api

import (
	"pids-cloud-server/app/common"
	"pids-cloud-server/app/middleware"
	"pids-cloud-server/entity"
	"pids-cloud-server/utils"

	"github.com/gin-gonic/gin"
)

// GetDbList 获取数据库信息列表
// @Summary 获取数据库信息列表
// @Description 获取数据库信息列表，支持分页和条件筛选
// @Tags 数据库信息
// @Accept json
// @Produce json
// @Param page query int false "页码，默认1"
// @Param pageSize query int false "每页大小，默认10"
// @Param ip query string false "IP地址"
// @Param db_type query string false "数据库类型"
// @Success 200 {object} common.Result{data=common.PageResult{list=[]entity.DbInfo}}
// @Failure 500 {object} common.Result
// @Router /db/list [get]
func GetDbList(c *gin.Context) {
	// 从上下文中获取分页参数
	pagination, _ := c.Get("pagination")
	paging := pagination.(*middleware.PaginationParams)

	db := utils.GetDB()
	if db == nil {
		common.ErrorResponse(c, 500, "数据库连接失败")
		return
	}
	ip := c.Query("ip")
	db_type := c.Query("db_type")

	query := db.Model(&entity.DbInfo{})
	if ip != "" {
		query = query.Where("ip LIKE ?", "%"+ip+"%")
	}
	if db_type != "" {
		query = query.Where("db_type = ?", db_type)
	}

	// 获取总记录数
	var total int64
	if err := query.Count(&total).Error; err != nil {
		common.ErrorResponse(c, 500, "查询失败")
		return
	}

	// 获取分页数据
	var dbList []entity.DbInfo
	if err := query.Offset((paging.Page - 1) * paging.PageSize).Limit(paging.PageSize).Find(&dbList).Error; err != nil {
		common.ErrorResponse(c, 500, "查询失败")
		return
	}

	common.SuccessPageResponse(c, dbList, total, paging.Page, paging.PageSize)
}

// AddDbInfo 新增数据库信息
// @Summary 新增数据库信息
// @Description 新增一条数据库信息
// @Tags 数据库信息
// @Accept json
// @Produce json
// @Param dbInfo body entity.DbInfo true "数据库信息"
// @Success 200 {object} common.Result{data=entity.DbInfo}
// @Failure 400 {object} common.Result
// @Failure 500 {object} common.Result
// @Router /db/add [post]
func AddDbInfo(c *gin.Context) {
	var dbInfo entity.DbInfo
	if err := c.ShouldBindJSON(&dbInfo); err != nil {
		common.ErrorResponse(c, 400, "参数错误")
		return
	}
	db := utils.GetDB()
	if db == nil {
		common.ErrorResponse(c, 500, "数据库连接失败")
		return
	}
	if err := db.Create(&dbInfo).Error; err != nil {
		common.ErrorResponse(c, 500, "新增失败")
		return
	}
	common.SuccessResponse(c, dbInfo)
}

// UpdateDbInfo 更新数据库信息
// @Summary 更新数据库信息
// @Description 更新数据库信息
// @Tags 数据库信息
// @Accept json
// @Produce json
// @Param updateData body map[string]interface{} true "更新数据，必须包含id字段"
// @Success 200 {object} common.Result
// @Failure 400 {object} common.Result
// @Failure 500 {object} common.Result
// @Router /db/update [put]
func UpdateDbInfo(c *gin.Context) {
	var updateData map[string]interface{}
	if err := c.ShouldBindJSON(&updateData); err != nil {
		common.ErrorResponse(c, 400, "参数错误")
		return
	}
	id, ok := updateData["id"].(float64)
	if !ok {
		common.ErrorResponse(c, 400, "ID参数错误")
		return
	}
	db := utils.GetDB()
	if db == nil {
		common.ErrorResponse(c, 500, "数据库连接失败")
		return
	}
	if err := db.Model(&entity.DbInfo{}).Where("id = ?", int(id)).Updates(updateData).Error; err != nil {
		common.ErrorResponse(c, 500, "更新失败")
		return
	}
	common.SuccessResponse(c, nil)
}

// DeleteDbInfo 删除数据库信息
// @Summary 删除数据库信息
// @Description 根据ID删除数据库信息
// @Tags 数据库信息
// @Accept json
// @Produce json
// @Param id path string true "数据库信息ID"
// @Success 200 {object} common.Result
// @Failure 500 {object} common.Result
// @Router /db/delete/{id} [delete]
func DeleteDbInfo(c *gin.Context) {
	id := c.Param("id")
	db := utils.GetDB()
	if db == nil {
		common.ErrorResponse(c, 500, "数据库连接失败")
		return
	}
	if err := db.Delete(&entity.DbInfo{}, id).Error; err != nil {
		common.ErrorResponse(c, 500, "删除失败")
		return
	}
	common.SuccessResponse(c, nil)
}
